#ifndef EXP_1_H
#define EXP_1_H
#include "base.h"
#define NaN -1
typedef struct course_node {
    char name[21];
    struct course_node *next;
} Course;

typedef struct score_node {
    int val;
    struct score_node *next;
} Score;

typedef struct {
    char name[11];
    int id;
    Score scoreList; //链表头节点为空
} STU;

typedef struct {
    STU *data; // 顺序表存储空间的基址（指向顺序表所占内存的起始位置）
    int size;  // 当前顺序表长度（包含多少元素）
    int capacity; // 当前分配的存储容量（可以存储多少元素）
} SqList;

typedef struct {
    SqList studentList; //学生列表
    int courseNum;
    Course courseList;
} DataBase;

//顺序表操作,该顺序表序号从0开始
Status SqList_init(SqList *L); //初始化顺序表
Status SqList_init_capacity(SqList *L,
                            int _capacity); //初始化顺序表，自定义初始容量
Status SqList_destroy(SqList *L);           //销毁顺序表
Status SqList_valid(SqList *L);             //检测顺序表是否有效
Status SqList_clear(SqList *L);             //清空顺序表
Status SqList_empty(SqList *L);             //检测顺序表是否为空
int SqList_size(SqList *L);                 //获取顺序表长度
Status SqList_at(SqList *L, int i, STU *e);         //获取序号为i的元素
Status SqList_insert(SqList *L, int index, STU *e); //在序号index的位置插入
Status SqList_pushBack(SqList *L, STU *e); //顺序表末端插入元素
Status SqList_erase(SqList *L, int index); //删除序号index的元素
void SqList_traverse(SqList *L, void (*visit)(STU*)); //遍历顺序表

//基本函数
int print_STU(STU *s);                   //显示学生基本信息
int print_STU_Score(STU *s, Course *co); //显示学生信息及成绩

//函数声明
void add_subject(DataBase*L,int len);//增加课程
void dele_subject(DataBase*L,int len);//删除课程
void modified_grades(SqList* L,int len,Course*co);//修改某学生某一科目成绩
#endif